昨天稍微介紹了光線追跡用的ABCD Matrix,今天就來試試,和ChatGPT合作寫出能活用的程式碼。
前情提要:
情境設計:
初始光線[0, 0.1],X為0,弧度為0.1
第一個透鏡(凸):X為5,焦距為10
第二個透鏡(凹):X為10,焦距為-5
接下來使用 Python 進行計算:
(程式碼的部分我就不分段貼上,這樣大家可以一鍵複製到自己的編碼器上跑看看。)
import numpy as np
import matplotlib.pyplot as plt
# 定義ABCD矩陣
def abcd_matrix(A, B, C, D):
return np.array([[A, B], [C, D]])
# 透鏡的ABCD矩陣 (焦距為 f 的薄透鏡)
def thin_lens(f):
return abcd_matrix(1, 0, -1/f, 1)
# 傳播距離為 d 的介質ABCD矩陣
def propagation(d, n=1): # n 是折射率
return abcd_matrix(1, d/n, 0, 1)
# 初始光線狀態
incident_ray = np.array([0, 0.1]) # 位置 r = 0, 弧度 θ = 0.1 rad
# 定義光學系統
lens1 = thin_lens(10) # 焦距為 10 的凸透鏡
medium = propagation(5) # 傳播距離為 5 的介質
lens2 = thin_lens(-5) # 焦距為 -5 的凹透鏡
# 光學系統中各點的光線狀態
rays = [incident_ray]
# 計算光線經過每個元件後的狀態
rays.append(np.dot(medium, rays[-1])) # 介質
rays.append(np.dot(lens1, rays[-1])) # 第1個透鏡
rays.append(np.dot(medium, rays[-1])) # 介質
rays.append(np.dot(lens2, rays[-1])) # 第2個透鏡
# 每個元件的位置
positions = [0, 5, 5, 10, 10] # 每個元件的位置:光源-介質-凸透鏡-介質-凹透鏡-介質
#各段光線弧度
angles = [ray[1] for ray in rays]
#畫圖
plt.figure(figsize=(10, 6))
plt.plot(positions, angles, marker='o')
# 添加標籤,並指定字體屬性
plt.text(5, angles[1], 'Medium (D=5mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='cadetblue')
plt.text(5, angles[3], 'Lensvex 1 (focal=10mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='steelblue')
plt.text(10, angles[4], 'Lenscave 2 (focal=-5mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='cornflowerblue')
plt.title('Light Trace through Optical System', fontsize=16, fontfamily='serif', fontweight='bold')
plt.xlabel('Position (mm)', fontsize=14, fontfamily='serif')
plt.ylabel('Beam angle Displacement (r)', fontsize=14, fontfamily='serif')
plt.grid(True)
plt.show()
以上是根據chatGPT給出的程式碼進行修正後畫出來的圖,顯示光線通過介質或透鏡後的位置與弧度。
其實一開始chatgpt給的程式碼內容是有誤,錯誤是出在對公式解釋有些問題,手動修改後今天就累惹QQ,我對於這樣的圖表不是很滿意,畢竟不直觀,明天再繼續做修改!